/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package estructurassa.controladores.ABMRutaFabricacion;

import estructurassa.controladores.ABMProductoIntermedio.ControladorABMProductoIntermedio;
import estructurassa.controladores.Controlador;
import estructurassa.controladores.ControladorPrincipal;
import estructurassa.controladores.FabricaControladores;
import estructurassa.entidades.CategoriaTrabajador;
import estructurassa.entidades.CentroTrabajo;
import estructurassa.entidades.EtapaFabricacion;
import estructurassa.entidades.Maquinaria;
import estructurassa.entidades.ProductoIntermedio;
import estructurassa.entidades.ProductoTerminado;
import estructurassa.entidades.RutaFabricacion;
import estructurassa.expertos.ExpertoABMRutaFabriacion;
import estructurassa.expertos.FabricaExpertos;
import estructurassa.expertos.excepciones.ABMRutaFabricacionException;
import estructurassa.utiles.filtrosTexto.AgregarFiltroTextField;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.List;
import javax.swing.JInternalFrame;
import javax.swing.JOptionPane;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import newotcapp.modeloComboBox.ModeloComboGenerico;
import persistencia.exceptions.ExcepcionFachada;

/**
 *
 * @author diego
 */
public class ControladorABMRutaFabricacion implements Controlador {

    private PantallaABMRutaFabricacion pantalla;
    private ExpertoABMRutaFabriacion experto;
    private ProductoTerminado producto;
    private boolean iniciado = false;
    private EtapaFabricacion etapaSeleccionada;

    public ControladorABMRutaFabricacion() {
        pantalla = new PantallaABMRutaFabricacion();
        experto = (ExpertoABMRutaFabriacion) FabricaExpertos.getInstancia().getExperto(FabricaExpertos.expertos.ABM_RUTA_DE_FABRICACION);
        pantalla.getTblEtapasFabricacion().setModel(new ModeloTablaRutaFabricacion());
        pantalla.getTblEtapasFabricacion().getSelectionModel().addListSelectionListener(new ListSelectionListener() {
            @Override
            public void valueChanged(ListSelectionEvent e) {
                seleccionarEtapa();
            }
        });

        pantalla.getBtnAgregarEtapa().addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                agregarEtapa();
            }
        });

        pantalla.getBtnQuitarEtapa().addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                quitarEtapa();
            }
        });
        pantalla.getBtnNuevoProdInt().addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                iniciarABMProductoIntermedio();
            }
        });
        AgregarFiltroTextField.filtroNumeroDecimal(pantalla.getTxtDuracion(), 2);
        /**
         * ##############################################################
         * ############################################################## Barra
         * de Herramientas
         * ##############################################################
         * ##############################################################
         */
        pantalla.getBtnSalir().addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                salir();
            }
        });
        pantalla.getBtnGuardar().addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                guardarRutaFabricacion();
            }
        });
        pantalla.getBtnNuevaEtapa().addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                nuevaEtapa();
            }
        });
    }

    public void setProducto(ProductoTerminado producto) {
        this.producto = producto;
        if (producto.getRutaFabricacion() == null) {
            producto.setRutaFabricacion(new RutaFabricacion());
        }
        pantalla.getLblNombreProducto().setText(producto.getNombreElemento());
        mostrarEtapas();
    }

    public void mostrarEtapas() {
        ((ModeloTablaRutaFabricacion) pantalla.getTblEtapasFabricacion().getModel()).setListaElementos(producto.getRutaFabricacion().getEstapasFabricacion());
    }

    @Override
    public JInternalFrame getPantalla() {
        return pantalla;
    }

    @Override
    public void iniciar() {
        if (!iniciado) {
            ((ControladorPrincipal) FabricaControladores.getInstance().getControlador(FabricaControladores.controladoresNombre.PRINCIPAL)).agregarPantallaInterna(pantalla);
            nuevaEtapa();
            iniciado = true;
        }else if(!(pantalla.getCbxOperario().getSelectedIndex()>0)){
            nuevaEtapa();
        }
        ((ModeloTablaRutaFabricacion) pantalla.getTblEtapasFabricacion().getModel()).setListaElementos(producto.getRutaFabricacion().getEstapasFabricacion());
        pantalla.setVisible(true);
        iniciarCombos();
    }

    private void iniciarCombos() {
        pantalla.getCbxCentroTrabajo().setModel(new ModeloComboGenerico(experto.buscarCentrosTrabajo()));
        pantalla.getCbxMaquinaria().setModel(new ModeloComboGenerico(experto.buscarMaquinarias()));
        pantalla.getCbxOperario().setModel(new ModeloComboGenerico(experto.buscarCategorias()));
        pantalla.getCbxProdIntermedio().setModel(new ModeloComboGenerico(experto.buscarProductosIntermedios()));
    }

    private void agregarEtapa() {
        if (etapaSeleccionada == null) {
            etapaSeleccionada = new EtapaFabricacion();
        }
        if (pantalla.getTxtNroEtapa().getText().length() > 0) {
            etapaSeleccionada.setNroEtapa(Integer.valueOf(pantalla.getTxtNroEtapa().getText()));
        } else {
            etapaSeleccionada.setNroEtapa(0);
        }
        etapaSeleccionada.setDescripcion(pantalla.getTxtDescripcion().getText());
        if (pantalla.getTxtDuracion().getText().length() > 0) {
            etapaSeleccionada.setDuracion(Float.valueOf(pantalla.getTxtDuracion().getText()));
        } else {
            etapaSeleccionada.setDuracion(0f);
        }
        etapaSeleccionada.setMaquina((Maquinaria) ((ModeloComboGenerico) pantalla.getCbxMaquinaria().getModel()).getItemSeleccionado());
        etapaSeleccionada.setProductoIntermedio((ProductoIntermedio) ((ModeloComboGenerico) pantalla.getCbxProdIntermedio().getModel()).getItemSeleccionado());
        etapaSeleccionada.setCategoriaTrabajador(((CategoriaTrabajador) ((ModeloComboGenerico) pantalla.getCbxOperario().getModel()).getItemSeleccionado()));
        if (pantalla.getCbxCentroTrabajo().getSelectedIndex() > 0) {
            etapaSeleccionada.setCentroDeTrabajo((CentroTrabajo) ((ModeloComboGenerico) pantalla.getCbxCentroTrabajo().getModel()).getItemSeleccionado());
        }
        etapaSeleccionada.setUnidadTiempo("hs");

        List etapas = ((ModeloTablaRutaFabricacion) pantalla.getTblEtapasFabricacion().getModel()).getListaElementos();
        for (Object object : etapas) {
            if (etapaSeleccionada.getNroEtapa() == ((EtapaFabricacion) object).getNroEtapa()) {
                ((ModeloTablaRutaFabricacion) pantalla.getTblEtapasFabricacion().getModel()).fireTableDataChanged();
                return;
            }
        }
        ((ModeloTablaRutaFabricacion) pantalla.getTblEtapasFabricacion().getModel()).addRow(etapaSeleccionada);
        nuevaEtapa();
    }

    private void quitarEtapa() {
        if (etapaSeleccionada == null) {
            return;
        }
        List etapas = ((ModeloTablaRutaFabricacion) pantalla.getTblEtapasFabricacion().getModel()).getListaElementos();
        for (int i = 0; i < etapas.size(); i++) {
            if (etapaSeleccionada.getNroEtapa() == ((EtapaFabricacion) etapas.get(i)).getNroEtapa()) {
                ((ModeloTablaRutaFabricacion) pantalla.getTblEtapasFabricacion().getModel()).removeRow(i);
                return;
            }
        }
    }

    private void seleccionarEtapa() {
        int fila = pantalla.getTblEtapasFabricacion().getSelectedRow();
        if (fila == -1) {
            return;
        }
        int filaModelo = pantalla.getTblEtapasFabricacion().convertRowIndexToModel(fila);
        etapaSeleccionada = (EtapaFabricacion) ((ModeloTablaRutaFabricacion) pantalla.getTblEtapasFabricacion().getModel()).getRow(filaModelo);
        mostrarEtapa(etapaSeleccionada);
    }

    private void iniciarABMProductoIntermedio() {
        ControladorABMProductoIntermedio controladorProdInt = (ControladorABMProductoIntermedio) FabricaControladores.getInstance().getControlador(FabricaControladores.controladoresNombre.ABM_PRODUCTO_INTERMEDIO);
        controladorProdInt.setProductoRelacionado(producto);
        controladorProdInt.iniciar();
    }

    private void salir() {
        pantalla.setVisible(false);
    }

    private void guardarRutaFabricacion() {
        List etapasFabricacion = ((ModeloTablaRutaFabricacion) pantalla.getTblEtapasFabricacion().getModel()).getListaElementos();
        producto.getRutaFabricacion().setEstapasFabricacion(etapasFabricacion);

        try {
            experto.guardar(producto.getRutaFabricacion());
        } catch (ABMRutaFabricacionException ex) {
            JOptionPane.showMessageDialog(pantalla, ex.getMessage(), "INFORMACIÓN", JOptionPane.INFORMATION_MESSAGE);
            return;
        } catch (ExcepcionFachada ex) {
            JOptionPane.showMessageDialog(pantalla, ex.getMessage(), "ERROR", JOptionPane.ERROR_MESSAGE);
            return;
        }
        JOptionPane.showMessageDialog(pantalla, "Ruta de Fabricación Guardada Correctamente", "INFORMACIÓN", JOptionPane.INFORMATION_MESSAGE);
    }

    private void mostrarEtapa(EtapaFabricacion etapaSeleccionada) {
        if (etapaSeleccionada == null) {
            return;
        }
        pantalla.limpiarCampos();
        pantalla.getTxtNroEtapa().setText(String.valueOf(etapaSeleccionada.getNroEtapa()));
        ((ModeloComboGenerico) pantalla.getCbxOperario().getModel()).setItemSeleccionado(etapaSeleccionada.getCategoriaTrabajador());
        ((ModeloComboGenerico) pantalla.getCbxCentroTrabajo().getModel()).setItemSeleccionado(etapaSeleccionada.getCentroDeTrabajo());
        ((ModeloComboGenerico) pantalla.getCbxMaquinaria().getModel()).setItemSeleccionado(etapaSeleccionada.getMaquina());
        ((ModeloComboGenerico) pantalla.getCbxProdIntermedio().getModel()).setItemSeleccionado(etapaSeleccionada.getProductoIntermedio());
        pantalla.getTxtDescripcion().setText(etapaSeleccionada.getDescripcion());
        pantalla.getTxtDuracion().setText(String.valueOf(etapaSeleccionada.getDuracion()));
    }

    private void nuevaEtapa() {
        etapaSeleccionada = null;
        pantalla.limpiarCampos();
        sugerirNumeroEtapa();
    }

    private void sugerirNumeroEtapa() {
        List etapas = ((ModeloTablaRutaFabricacion) pantalla.getTblEtapasFabricacion().getModel()).getListaElementos();
        int mayorNumero = 0;
        for (Object object : etapas) {
            if (((EtapaFabricacion) object).getNroEtapa() > mayorNumero) {
                mayorNumero = ((EtapaFabricacion) object).getNroEtapa();
            }
        }
        int sugerido = mayorNumero + 1;
        pantalla.getTxtNroEtapa().setText(String.valueOf(sugerido));
        pantalla.getCbxOperario().requestFocus();
    }
}
